<?php
/**
 * Created by PhpStorm.
 * User: My pc
 * Date: 2017/1/26/026
 * Time: 11:09
 */
//模板类
class Templates {

    private $_vars = array(); // 保存动态变量
    private $_config = array(); // 保存系统变量

    // 验证各个目录是否存在
    public function __construct() {
        if(!is_dir(TPL_DIR) || !is_dir(TPL_C_DIR) || !is_dir(CACHE)) {
            exit('ERROR:模板或编译或缓存目录不存在，请手工设置！');
        }
        // 保存系统变量
        $_sxe = simplexml_load_file(ROOT_PATH.'/config/profile.xml');
        $_tagLib = $_sxe->xpath('taglib');

        foreach($_tagLib as $_tag) {
            $this->_config["$_tag->name"] = $_tag->value;
        }
        //print_r($this->_config);
    }

    // 用于注入变量
    public function assign($_var,$_value) {
        if(isset($_var) && !empty($_var)) {
            $this->_vars[$_var] = $_value;
        } else {
            exit('ERROR:请设置模板变量！');
        }
    }

    //cache()方法，跳转到缓存文件，不执行PHP了，不连接数据了
    public function cache($_file) {
        //给include进来的tpl传一个模板操作的对象
        $_tpl = $this;
        $_tplFile =  TPL_DIR.$_file;
        if(!file_exists($_tplFile)) {
            exit('ERROR: 模板文件不存在！');
        }
        // 是否加入参数
        if (!empty($_SERVER["QUERY_STRING"])) {
            $_file .= $_SERVER["QUERY_STRING"];
        }
        // 编译文件
        $_parFile =  TPL_C_DIR.md5($_file).$_file.'.php';
        // 缓存文件
        $_cacheFile = CACHE.md5($_file).$_file.'.html';
        // 当第二次运行相同文件时，直接载入缓存文件，避开编译文件
        if(IS_CACHE) {
            // 编译文件和载入文件同时存在时
            if(file_exists($_parFile) && file_exists($_cacheFile)) {
                // 判断模板文件是否修改过，判断编译文件是否修改过
                if(filemtime($_parFile) >= filemtime($_tplFile) && filemtime($_cacheFile) >= filemtime($_parFile)) {
                    include $_cacheFile;
                    exit();
                }
            }
        }
    }

    // display
    public function display($_file) {
        //给include进来的tpl传一个模板操作的对象
        $_tpl = $this;
        $_tplFile =  TPL_DIR.$_file;
        if(!file_exists($_tplFile)) {
            exit('ERROR: 模板文件不存在！');
        }
        // 是否加入参数
        if (!empty($_SERVER["QUERY_STRING"])) {
            $_file .= $_SERVER["QUERY_STRING"];
        }
        // 编译文件
        $_parFile =  TPL_C_DIR.md5($_file).$_file.'.php';
        // 缓存文件
        $_cacheFile = CACHE.md5($_file).$_file.'.html';
        // 生成编译文件
        if(!file_exists($_parFile) || filemtime($_parFile) < filemtime($_tplFile)) {
            require_once ROOT_PATH.'/includes/Parser.class.php';
            $_parser = new Parser($_tplFile);
            $_parser->compile($_parFile);
        }
        // 载入编译文件
        include $_parFile;
        if(IS_CACHE) {
            // 生成缓存文件
            file_put_contents($_cacheFile,ob_get_contents());
            // 清除缓存
            ob_end_clean();
            // 载入缓存文件
            include $_cacheFile;
        }
    }

    //创建create方法，用于header和footer这种模块模板解析使用，而不需要生成缓存文件
    public function create($_file) {
        //设置模板的路径
        $_tplFile = TPL_DIR.$_file;
        //判断模板是否存在
        if (!file_exists($_tplFile)) {
            exit('ERROR：模板文件不存在！');
        }
        //编译文件
        $_parFile = TPL_C_DIR.md5($_file).$_file.'.php';
        //当编译文件不存在，或者模板文件修改过，则生成编译文件
        if (!file_exists($_parFile) || filemtime($_parFile) < filemtime($_tplFile)) {
            //引入模板解析类
            require_once ROOT_PATH.'/includes/Parser.class.php';
            $_parser = new Parser($_tplFile);   //模板文件
            $_parser->compile($_parFile);  //编译文件
        }
        //载入编译文件
        include $_parFile;
    }

}